export enum StrEnum {
    PHONE = 'phone',
    TEL = 'tel',
    CARD = 'card',
    PWD = 'pwd',
    POSTAL = 'postal',
    QQ = 'qq',
    EMAIL = 'email',
    MONEY = 'money',
    URL = 'URL',
    IP = 'IP',
    DATE = 'date',
    NUMBER = 'number',
    ENGLISH = 'english',
    CHINESE = 'chinese',
    LOWER = 'lower',
    UPPER = 'upper',
    HTML = 'HTML',
}

/**
 * 检验字符串类型
 * @param str 字符串
 * @param type 类型 phone | tel | card | postal | qq | email | URL | IP | date | number | english | chinese | lower | upper | HTML
 */
export const strCheck = (str: string, type: StrEnum): boolean =>  {
    switch (type) {
        // 手机号码
        case StrEnum.PHONE:
            return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
        // 座机
        case StrEnum.TEL:
            return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
        // 身份证
        case StrEnum.CARD:
            return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
        // 密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
        case StrEnum.PWD:
            return /^[a-zA-Z]\w{5,17}$/.test(str);
        // 邮政编码
        case StrEnum.POSTAL:
            return /[1-9]\d{5}(?!\d)/.test(str);
        // QQ号
        case StrEnum.QQ:
            return /^[1-9][0-9]{4,9}$/.test(str);
        // 邮箱
        case StrEnum.EMAIL:
            return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
        // 金额(小数点2位)
        case StrEnum.MONEY:
            return /^\d*(?:\.\d{0,2})?$/.test(str);
        // 网址
        case 'URL':
            return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str);
        // IP
        case 'IP':
            return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
        // 日期时间
        case 'date':
            return (
                /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) ||
                /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
            );
        // 数字
        case 'number':
            return /^[0-9]$/.test(str);
        // 英文
        case 'english':
            return /^[a-zA-Z]+$/.test(str);
        // 中文
        case 'chinese':
            return /^[\u4E00-\u9FA5]+$/.test(str);
        // 小写
        case 'lower':
            return /^[a-z]+$/.test(str);
        // 大写
        case 'upper':
            return /^[A-Z]+$/.test(str);
        // HTML标记
        case 'HTML':
            return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
        default:
            return false;
    }
};

/**
 * 字符串去除空格（默认会返回清除所有空格）
 * @param str
 * @param type  type 1-所有空格  2-前后空格  3-前空格 4-后空格
 */
export const trim = (str: string, type: number = 1) => {
    switch (type) {
        case 1:
            return str.replace(/\s+/g, "");
        case 2:
            return str.replace(/(^\s*)|(\s*$)/g, "");
        case 3:
            return str.replace(/(^\s*)/g, "");
        case 4:
            return str.replace(/(\s*$)/g, "");
        default:
            return str.replace(/\s+/g, "");
    }
}

/**
 * 根据内容超过指定长度显示。。。
 * @param cont
 * @param len 自定义长度
 */
export const sliceContent = (cont: string, len: number = 8) => {
    return cont.length <= len ? cont : cont.slice(0, len) + '...'
}

/**
 * 手机号脱敏
 * @param phone
 * @param begin 起始位置
 * @param len 加密长度
 */
export const phoneDes = (phone: string ) => {
    try {
        return phone.replace(/(?<=\d{3})\d{4}(?=\d{4})/, "****");
        // tslint:disable-next-line:no-empty
    }catch (error){
        // 适配mac
        return phone.substring(0,3)+ "****" + phone.substring(8,11);
    }
}

/**
 * 身份证号码脱敏
 * @param identifynumber
 */
export const identifynumberDes = (identifynumber: string ) => {
    try {
        return identifynumber.replace(/(?<=\d{3})\d{12}(?=\d{2}[0-9A-Z]{1})/, "************");
        // tslint:disable-next-line:no-empty
    }catch (error){
        // 适配mac
        return identifynumber.substring(0,3) + "************"+identifynumber.substring(15,18);
    }
}
